package com.wnxy.f_lock;

import org.openjdk.jol.info.ClassLayout;

import java.util.concurrent.TimeUnit;

public class LockApp {
    // 锁升级演示
    public static void main(String[] args) throws InterruptedException {
        User user01 = new User();
        System.out.println("无状态（001）：" + ClassLayout.parseInstance(user01).toPrintable());
        // 从jdk6开始，jvm默认延迟4s自动开启开启偏向锁。通过-XX:BiasedLockingStartupDelay=0设置取消延迟
        // 如果不要偏向锁：-XX:-UseBiasedLocking=false
        TimeUnit.SECONDS.sleep(5);
        User user02 = new User();
        System.out.println("启用偏向锁（101）：" + ClassLayout.parseInstance(user02).toPrintable());

        for (int i = 0; i < 2; i++) {
            synchronized (user02) {
                System.out.println("偏向锁（101）带线程ID：" + ClassLayout.parseInstance(user02).toPrintable());
            }
            // 偏向锁释放，对象头不会变化，一直存在， （偏向线程id） 下次执行判断是否同一个线程如果是直接执行
            System.out.println("偏向锁（101）释放线程ID：" + ClassLayout.parseInstance(user02).toPrintable());
        }

        // 多个线程加锁，升级为轻量级锁
        new Thread(() -> {
            synchronized (user02) {
                System.out.println("轻量级锁（00）：" + ClassLayout.parseInstance(user02).toPrintable());
                try {
                    System.out.println("=====休眠3秒======");
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("轻量-->重量（10）：" + ClassLayout.parseInstance(user02).toPrintable());
            }
        }).start();

        TimeUnit.SECONDS.sleep(1);
        new Thread(() -> {
            synchronized (user02) {
                System.out.println("重量级锁（10）：" + ClassLayout.parseInstance(user02).toPrintable());
            }
        }).start();
    }
}